
#include "texels.h"

#include <GL/glut.h>
#include <cassert>
#include <vector>

Texels::Texels(int ancho, int alto, std::vector<unsigned char> &texels) : 
   ancho_(ancho),
   alto_(alto),
   texels_(texels) {

      assert(ancho > 0);
      assert(alto > 0);

      assert(texels.size() == size_t(ancho * alto * bytesPorTexel()));
   }

void Texels::escalado(float escaladoAncho, float escaladoAlto) {
   assert(escaladoAlto > 0);
   assert(escaladoAncho > 0);

   int nuevoW, nuevoH;
   nuevoW = int(ancho_ * escaladoAncho);
   nuevoH = int(alto_ * escaladoAlto);

   std::vector<unsigned char> texelsEscalados(nuevoH * nuevoW * bytesPorTexel());

   if(gluScaleImage(GL_RGB, ancho_, alto_, GL_UNSIGNED_BYTE, &texels_[0],
            nuevoW, nuevoH, GL_UNSIGNED_BYTE, &texelsEscalados[0]) != 0) {
      throw EscaladoExcepcion();
   }

   texels_.swap(texelsEscalados);
   ancho_ = nuevoW;
   alto_ = nuevoH;
}

Texels::~Texels() {
   delete &texels_;
}

Texels::EscaladoExcepcion::EscaladoExcepcion() throw() : std::runtime_error("El escaldo fallo.") {}

Texels::EscaladoExcepcion::~EscaladoExcepcion() throw() {}

